package com.wyx.rtddels.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.csv.CsvReadConfig;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.text.csv.CsvWriter;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wyx.rtddels.domain.RtdTag;
import com.wyx.rtddels.domain.dto.CsvAddDto;
import com.wyx.rtddels.domain.dto.CsvDto;
import com.wyx.rtddels.domain.dto.CsvDtos;
import com.wyx.rtddels.domain.dto.DelsDtos;
import com.wyx.rtddels.mapper.RtdTagMapper;
import com.wyx.rtddels.service.RtdTagService;
import com.wyx.rtddels.util.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author wyx
 * @description 针对表【rtd_tag】的数据库操作Service实现
 * @createDate 2024-08-20 11:09:51
 */
@Service
@Slf4j
public class RtdTagServiceImpl extends ServiceImpl<RtdTagMapper, RtdTag>
        implements RtdTagService {

    @Autowired
    RtdTagMapper baseMapper;

    @Value("${rtd.login}")
    private String login;

    @Autowired
    HttpUtils httpUtil;

    @Autowired
    private HttpServletRequest request;

    // 每个线程处理的数据量
    private static final int size = 200;

    /**
     * 修改秒级别到毫秒级别数据
     *
     * @return
     */
    @Override
    public boolean updateMs() {
        // 获取token 值 来对他进行接下来的事件
        // String token = getToken();

        LambdaQueryWrapper<RtdTag> rtdTagLambdaQueryWrapper = new LambdaQueryWrapper<>();
        rtdTagLambdaQueryWrapper.eq(RtdTag::getMillisecond, 0);
        //  获取最终量合集
        List<RtdTag> rtdTags = baseMapper.selectList(rtdTagLambdaQueryWrapper);
        // rtdTags 最终结果集

        int count = rtdTags.size();
        //获取全部需要删除的id号
        List<Integer> collect = rtdTags.stream().map(rtdTag -> rtdTag.getId()).collect(Collectors.toList());
        List<CsvDtos> csvDtosList= new ArrayList<>();
        List<CsvDto> csvDtos= new ArrayList<>();

        rtdTags.forEach(k -> {

            DelsDtos delsDtos = new DelsDtos(k.getId());
            //根据id 来对他进行删除
            String jsonObj = httpUtil.testHttpservlet("http://128.128.10.101:8090/rtd/tag/remove", delsDtos);
            JSONObject jsonObject = JSONUtil.parseObj(jsonObj);

            CsvDto csvDto= new CsvDto();
            csvDtos.add(csvDto);
            //判断删除成功
            sendAddRtdUrl(csvDto,k, jsonObj,  csvDtosList);


        });

        return false;
    }

    /**
     * 登录接口
     */
    @Override
    public String getToken() {
        //发出的post请求
        String post = "{\"username\": \"superadmin\",\"password\": \"123456\"}";

        try {
            // 创建URL对象
            URL url = new URL(login);

            // 打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");

            connection.setRequestProperty("Content-Type", "application/json");
            int responseCode = connection.getResponseCode();
            System.out.println("响应码： " + responseCode);

            // 读取响应内容
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder content = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }

            in.close();
            connection.disconnect();
            System.out.println("响应内容： " + content.toString());
            //返回最终的token值
            return content.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 获取单个数据  (tagName) 唯一值
     *
     * @param tagName
     * @return
     */
    @Override
    public RtdTag getOnes(String tagName) {
        LambdaQueryWrapper<RtdTag> rtdTagLambdaQueryWrapper = new LambdaQueryWrapper<>();
        rtdTagLambdaQueryWrapper.eq(RtdTag::getTag, tagName);
        //获取
        RtdTag rtdTag = baseMapper.selectOne(rtdTagLambdaQueryWrapper);
        return rtdTag;
    }


    @Value("${rtd.read}")
    private String read;

    /**
     * 获取csb文件 数据
     *
     * @return
     */
    @Override
    public List<CsvDto> getFiles() {
        try {
            //读取文件
            String filePath = read;

            CsvReadConfig csvReadConfig = new CsvReadConfig();
            // 是否跳过空白行
            csvReadConfig.setSkipEmptyRows(true);
            // 是否设置首行为标题行
            csvReadConfig.setContainsHeader(true);

            CsvReader reader = CsvUtil.getReader(csvReadConfig);

            List<CsvDto> result = reader.read(
                    ResourceUtil.getUtf8Reader(filePath), CsvDto.class);


            for (CsvDto csvRow : result) {
                //getRawList返回一个List列表，列表的每一项为CSV中的一个单元格（既逗号分隔部分）
                Console.log(csvRow.toString());
            }

            return result;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 最终操作 尝试操作rtd
     */

    @Override
    public boolean trySend() {
        //获取 文件中需要修改的数据
        List<CsvDto> files = getFiles();
        List<CsvDtos> csvDtosList = new ArrayList<>();
        for (CsvDto csvDto : files) {
            //获取 tagName
            String tagName = csvDto.getTagName();

            //获取单条数据
            RtdTag rtdTag = getOnes(tagName);

            if (rtdTag != null) {
                // 如果是4 代表浮点
                if (rtdTag.getTagtype().equals("4")) {
                    // 删除数据 发送请求
                    DelsDtos delsDtos = new DelsDtos(rtdTag.getId());
                    ArrayList<Integer> idx = new ArrayList<>();
                    idx.add(rtdTag.getId());
                    delsDtos.setId(idx);
                    //已经删除完毕
                    String s = httpUtil.testHttpservlet("http://128.128.10.101:8090/rtd/tag/remove", delsDtos);
                    sendAddRtdUrl(csvDto, rtdTag, s, csvDtosList);
                } else {
                    CsvDtos csvDtos = new CsvDtos();
                    BeanUtils.copyProperties(csvDto, csvDtos);
                    csvDtos.setCode("已经成功过的任务");
                    csvDtosList.add(csvDtos);
                }
            }


        }
        // 写入CSV文件，即使发生异常也要写入
        writerCsv(csvDtosList);
        return true;
    }

    /**
     * 发送 增加rtd 的请求
     *
     * @param csvDto
     * @param rtdTag
     * @param s
     * @param csvDtosList
     */
    private void sendAddRtdUrl(CsvDto csvDto, RtdTag rtdTag, String s, List<CsvDtos> csvDtosList) {
        try {
            //新增测点的类
            CsvAddDto csvAddDto = new CsvAddDto();
            BeanUtils.copyProperties(rtdTag, csvAddDto);
            csvAddDto.setTagtype("1");
            csvAddDto.setAttr(new ArrayList<>());
            log.info("新增数据的结果解析" + csvAddDto.toString());
            JSONObject jsonObject = JSONUtil.parseObj(s);
            if (jsonObject.get("code").toString().equals("0")) {
                // todo 发送新增请求 差一个封装数据的方法  写入csv 文件中
                //新增数据
                String end = httpUtil.testHttpservlet("http://128.128.10.101:8090/rtd/tag/add", csvAddDto);
                log.info("新增数据" + csvAddDto);
                log.info("结果" + end);
                JSONObject entries = JSONUtil.parseObj(end);
                String o = (String) entries.get("code").toString();
                CsvDtos csvDtos = new CsvDtos();
                BeanUtils.copyProperties(csvDto, csvDtos);
                csvDtos.setCode("成功");
                if (!o.equals("0")) {
                    csvDtos.setCode("第二部新增存在问题");
                }
                csvDtosList.add(csvDtos);
                //跳出当前循环 执行接下来的循环
                return;
            }
            // todo 重试 新增请求
            String end = httpUtil.testHttpservlet("http://128.128.10.101:8090/rtd/tag/add", csvAddDto);
            JSONObject entries = JSONUtil.parseObj(end);
            String o = (String) entries.get("code").toString();
            CsvDtos csvDtos = new CsvDtos();
            BeanUtils.copyProperties(csvDto, csvDtos);
            csvDtos.setCode("成功");
            if (!o.equals("0")) {
                csvDtos.setCode("第一部删除未成功");
            }

            csvDtosList.add(csvDtos);

        } catch (Exception e) {
            log.info(String.valueOf(e));
            CsvDtos csvDtos = new CsvDtos();
            BeanUtils.copyProperties(csvDto, csvDtos);
            csvDtos.setCode("失败的任务");
            csvDtosList.add(csvDtos);
        }
    }

    @Value("${rtd.file}")
    private String filePath;

    /**
     * CsvWriter 写入csv文件 判断结果
     */
    @Override
    public void writerCsv(List<CsvDtos> csvDtosList) {

        String format = DateUtil.format(new Date(), "MM-dd-HH-mm-ss");
        String file = filePath + format + "hutoolCsv.csv";
        log.info("开始了写入结果" + file);
        File hutoolCsv = new File(file);

        CsvWriter writer = new CsvWriter(hutoolCsv, StandardCharsets.UTF_8);
        writer.writeBeans(csvDtosList);
        writer.flush();
        writer.close();
        log.info("结束了");
    }

    /**
     * 直接批量删除多余测点值  一个一个的删除
     *
     * @return
     */
    @Override
    public boolean del() {

        List<CsvDto> files = getFiles();
        List<CsvDtos> csvDtosList = new ArrayList<>();
        for (CsvDto csvDto : files) {
            //获取 tagName
            String tagName = csvDto.getTagName();

            //获取单条数据
            RtdTag rtdTag = getOnes(tagName);

            if (rtdTag != null) {
                // 如果是4 代表浮点
                if (rtdTag.getTagtype().equals("4")) {
                    // 删除数据 发送请求
                    DelsDtos delsDtos = new DelsDtos();
                    ArrayList<Integer> idx = new ArrayList<>();
                    idx.add(rtdTag.getId());
                    delsDtos.setId(idx);
                    //已经删除完毕
                    String s = httpUtil.testHttpservlet("http://128.128.10.101:8090/rtd/tag/remove", delsDtos);
                    JSONObject jsonObject = JSONUtil.parseObj(s);
                    if (jsonObject.get("code").toString().equals("0")) {
                        // todo 发送新增请求 差一个封装数据的方法  写入csv 文件中
                        //新增数据
                        CsvDtos csvDtos = new CsvDtos();
                        BeanUtils.copyProperties(csvDto, csvDtos);
                        csvDtos.setCode("成功");
                        csvDtosList.add(csvDtos);
                        //跳出当前循环 执行接下来的循环
                        continue;
                    } else {
                        CsvDtos csvDtos = new CsvDtos();
                        BeanUtils.copyProperties(csvDto, csvDtos);
                        csvDtos.setCode("失败");
                        csvDtosList.add(csvDtos);
                    }
                }
            }
        }
        writerCsv(csvDtosList);
        return false;
    }
}




